package com.dhu.graph.basic.SymbolGraph;

import com.dhu.graph.basic.AbstractGraph;
import com.dhu.graph.basic.GraphImpls.Graph;
import com.dhu.graph.utils.SymbolWeightedEdge;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @Author ：snow
 * @Date ：Created in 2020-04-23
 * @Description：
 * 借助于前面的已经实现了基础的Graph，实现用字符串表示顶点的图
 * 思路如下： 用一个st来保存字符串顶点和顶点的索引，
 * 再用一个数组keys用作反向索引，保存字符串的顶点名,作用主要是在Graph中保存的是索引，
 * 根据这些索引反过来在Keys中找到顶点名
 * @Modified By：
 * @Version:
 */
public abstract class SymbolGraph {
    protected Map<String, Integer> st = new HashMap<>();
    protected String [] keys;
    protected AbstractGraph G;

    protected SymbolGraph(){}
    //用数组来传递顶点，一行表示连接起来的几个顶点，
    protected SymbolGraph(String [][] v){
        //将顶点名都保存在st中
        for (int i = 0; i < v.length; i++){
            for (int j = 0; j < v[i].length; j++){
                if(!st.containsKey(v[i][j])){
                    st.put(v[i][j],st.size());
                }
            }
        }
        //将顶点名保存在keys中
        Set<String> keySet = st.keySet();
        keys = new String[st.size()];
        for (String key : keySet) {
            keys[st.get(key)] = key;
        }
        keySet = null;

    }

    /**
     * 再次遍历数组v,构建图Graph
     * @param v
     */
    protected void creatGraph(String [][] v, AbstractGraph G){
        this.G = G;
        for (int i = 0; i < v.length; i++) {
            int ver = st.get(v[i][0]);
            for (int j = 1; j < v[i].length; j++){
                G.addEdge(ver,st.get(v[i][j]));
            }
        }
    }

    public int index(String vertex){
        return st.get(vertex);
    }
    public String name(int v){
        return keys[v];
    }
}
